'use strict';
const Controller = require('egg').Controller;
const { _pwd } = require('../../utils/cryp');

// function toInt(str) {
//   if (typeof str === 'number') return str;
//   if (!str) return str;
//   return parseInt(str, 10) || 0;
// }

class UserController extends Controller {
  // 获取自己用户信息
  /**
     * @api {Get} /api/user/userInfo 获取自己用户信息
     * @apiGroup 用户
     * @apiParamExample 参数模板
     {}
     * @apiSuccessExample  成功返回
    {
        "msg": "成功操作",
        "result": {
            "id": 1,
            "real_name": "陈国宇",
            "name": "小雨商店3",
            "sex": null,
            "phone": "13631137045",
            "password": "123456",
            "birth_date": null,
            "header_img": null,
            "openid": null,
            "wx_name": null,
            "total_score": 0,
            "remain_score": 0,
            "use_score": 0,
            "createdAt": "2020-07-31T03:47:02.000Z",
            "updatedAt": "2020-07-31T03:52:05.000Z"
        }
    }
     * @apiErrorExample  错误返回
     * {
     *   "msg": "找不到该用户信息"
     * }
     */

  async userInfo() {
    const { ctx, service } = this;
    ctx.body = await service.shop.user.userInfo();
  }
  //获取访问量
  async visitnum() {
    const { ctx, service } = this;
    ctx.body = await service.shop.user.visitnum();
  }
  // 获取用户列表信息
  /**
     * @api {Get} /api/user 获取用户列表信息
     * @apiGroup 用户
     * @apiParamExample 参数模板
     {}
     * @apiSuccessExample  成功返回
     {
        "msg": "成功操作",
        "result": [
            {
                "id": 1,
                "real_name": "陈国宇",
                "name": "小雨商店3",
                "sex": null,
                "phone": "13631137045",
                "password": "123456",
                "birth_date": null,
                "header_img": null,
                "openid": null,
                "wx_name": null,
                "total_score": 0,
                "remain_score": 0,
                "use_score": 0,
                "createdAt": "2020-07-31T03:47:02.000Z",
                "updatedAt": "2020-07-31T03:52:05.000Z"
            },
            {
                "id": 2,
                "real_name": null,
                "name": "阿离",
                "sex": null,
                "phone": "13631137046",
                "password": "123456",
                "birth_date": null,
                "header_img": null,
                "openid": null,
                "wx_name": null,
                "total_score": 0,
                "remain_score": 0,
                "use_score": 0,
                "createdAt": "2020-07-31T05:31:22.000Z",
                "updatedAt": "2020-07-31T05:31:22.000Z"
            }
        ]
    }
     * @apiErrorExample  错误返回
     * {
     *   "msg": "请登录后再进行操作"
     * }
     */

  async index() {
    const { ctx, service } = this;
    ctx.body = await service.shop.user.index();
  }
  // 获取用户单个信息
  /**
     * @api {Get} /api/user/:id 获取用户单个信息
     * @apiGroup 用户
     * @apiParamExample 参数模板
     {}
     * @apiSuccessExample  成功返回
    {
        "msg": "成功操作",
        "result": {
            "id": 1,
            "real_name": "陈国宇",
            "name": "小雨商店3",
            "sex": null,
            "phone": "13631137045",
            "password": "123456",
            "birth_date": null,
            "header_img": null,
            "openid": null,
            "wx_name": null,
            "total_score": 0,
            "remain_score": 0,
            "use_score": 0,
            "createdAt": "2020-07-31T03:47:02.000Z",
            "updatedAt": "2020-07-31T03:52:05.000Z"
        }
    }
     * @apiErrorExample  错误返回
     * {
     *   "msg": "找不到该用户信息"
     * }
     */

  async show() {
    const { ctx, service } = this;
    const id = ctx.params.id;

    ctx.body = await service.shop.user.show(id);
  }
  // 更新用户信息
  /**
     * @api {put} /api/user/:id 更新用户信息
     * @apiGroup 用户
     * @apiParam {String}  name       // 昵称    （必填）
     * @apiParam {String}  phone      // 手机号码（必填）
     * @apiParam {String}  password   // 密码    （必填）
     * @apiParam {String}  verify     // 验证码
     * @apiParam {String}  real_name  // 真实名称
     * @apiParam {INTEGER} birth_date // 出生日期
     * @apiParam {String}  password   // 密码
     * @apiParam {String}  header_img // 头像
     * @apiParamExample 参数模板
     {}
     * @apiSuccessExample  成功返回
     {
      "code": 1,
      "msg": "成功操作",
      "result": {
          "id": 2,
          "name": "宇",           // 昵称     （必填）
          "phone": "13631137059", // 手机号码 （必填）
          "password": "123456",   // 密码     （必填）
          "real_name": null,      // 真实名称
          "sex": null,            // 性别 1男 2女
          "birth_date": null,     // 出生日期
          "header_img": null,     // 头像
          "openid": null,         // 微信openid
          "wx_name": null,        // 微信昵称
          "total_score": null,    // 总积分
          "remain_score": null,   // 剩余积分
          "use_score": null,      // 已使用积分
        }
      }
     * @apiErrorExample  错误返回
     * {
     *   "msg": "找不到该用户信息"
     * }
     */

  async update() {
    const { ctx, service } = this;
    const dataObj = ctx.request.body;

    const id = ctx.params.id;
    ctx.body = await service.shop.user.update(id, dataObj);
  }
  /**
     * @api {Post} /api/register 用户注册
     * @apiGroup 用户注册
     * @apiParam {String}  name       // 昵称    （必填）
     * @apiParam {String}  phone      // 手机号码（必填）
     * @apiParam {String}  password   // 密码    （必填
     * @apiParam {String}  verify     // 验证码
     * @apiParam {String}  real_name  // 真实名称
     * @apiParam {INTEGER} birth_date // 出生日期
     * @apiParam {String}  password   // 密码
     * @apiParam {String}  header_img // 头像
     * @apiParamExample 参数模板
     {
      "name": "yu",
      "password": "123456",
      "sex": 1,
      "realName": "张三",
      "phone":"13612345678"
      }
     * @apiSuccessExample 成功返回
     * {
     *    "msg":'成功注册'
     * }
     *
     * @apiErrorExample 错误返回
     * {
     *  "msg":"手机号码已注册"
     * }
     * @apiErrorExample 错误返回
     * {
     *  "msg":"注册失败"
     * }
     *
     */

  async create() {
    const { ctx, service } = this;
    const dataObj = ctx.request.body;

    if (
      new ctx.helper.checkData(this, 'password', 'phone', 'project_id')
        .checkDataRes
    ) {
      ctx.body = await service.shop.user.create(dataObj);
    }
  }

  /**
     * @api {POST} /api/user/wxlogin 微信登陆/注册
     * @apiGroup 用户注册
     * @apiParam {String}  code       // wx.login 得到的code值    （必填）
     * @apiParam {String}  name      // 用户昵称  （必填）
     * @apiParamExample 参数模板
     {
      "name": "yu",
      "code": "aj81jdsjs1823fasoqw"
      }
     *
     */
  async wxlogin() {
    const { ctx, app, service } = this;
    const { code, a: appid, s: secret } = ctx.request.body;
    const { User } = app.model.Tables.Shop;
    // const appid = 'wx858915d8c1353dc3'
    // const secret = '6bc9a472160f18b94c44cd20116167b5'
    const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=authorization_code`;

    try {
      const result = await ctx.curl(url, {
        method: 'GET',
        dataType: 'json',
      });

      if (result.data.errmsg)
        return ctx.helper.errorModule('请传入正确的 code 值');

      const { openid } = result.data;
      const userInfo = await User.findOrCreate({
        where: {
          phone: openid,
        },
        defaults: {
          phone: openid,
          password: '123456',
          name: '微信用户' + code.slice(0, 7),
        },
      });

      const time = Date.now();
      const { id } = userInfo[0];
      const { password: token } = new _pwd(id + time);
      // 添加token到用户表，默认过期时间一天
      await userInfo[0].update({
        token,
        token_out_of_date: new Date().getTime() + 24 * 60 * 60 * 1000,
        last_ip: ctx.request.ip,
      });
      delete userInfo[0].password;
      return ctx.helper.successModule(userInfo[0], '登录成功');
    } catch (error) {
      return ctx.helper.errorModule('请传入正确的 code 值，也有可能 name 重复');
    }
  }

  async recharge() {
    const { ctx, service } = this;
    const { money } = ctx.request.body;

    ctx.body = await service.shop.user.recharge(money);
  }

  async balance() {
    const { ctx, service } = this;
    ctx.body = await service.shop.user.balance();
  }
}

module.exports = UserController;
